package com.nvwa.dto.err;

public interface ErrorCode {
    ErrorCode SUCCESS = new Default("000", "ok");
    ErrorCode UNKNOW = new Default("999", "服务繁忙！");

    String getCode();

    String getMsg();

    static ErrorCode of(String code, String msg) {
        return new Default(code, msg);
    }

    default boolean is(String code) {
        return this.getCode().equals(code);
    }

    default boolean is(ErrorCode error) {
        return error != null && this.is(error.getCode());
    }

    static boolean isSuccess(String code) {
        return SUCCESS.is(code);
    }

    static boolean isSuccess(ErrorCode error) {
        return SUCCESS.is(error.getCode());
    }

    default Default with(String msg) {
        return new Default(this.getCode(), msg);
    }

    default Default withParams(Object... params) {
        String msg = this.getMsg();
        if (msg.indexOf('%') != -1) {
            msg = String.format(msg, params);
        }
        return new Default(this.getCode(), msg);
    }

    class Default implements ErrorCode {

        private final String code;
        private final String msg;

        @Override
        public String getCode() {
            return this.code;
        }

        @Override
        public String getMsg() {
            return this.msg;
        }

        public Default(final String code, final String msg) {
            this.code = code;
            this.msg = msg;
        }
    }

}
